home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Inside!
/
Amiga FD Inside (1995)(Ultramax).iso
/
forumamiga
/
ausgabe09
/
texte
/
scr_u._wins
< prev
next >
Wrap
Text File
|
1992-09-05
|
5KB
|
167 lines
André Voget
Wer sich - wie ich - daran gewöhnt hat, statt den Gfa-Basic-Befehlen die
Systemroutinen zu nutzen, um kürzeren und schnelleren Code zu erzeugen,
muß über kurz oder lang auch Screens und Windows selbst mit den System
routinen öffnen. Meine Routinen möchte ich nun hier veröffentlichen. Für
Anregungen und Verbesserungsvorschläge wäre ich sehr dankbar.
Vorteile der hier vorgestellten Routinen zu den entsprechenden Gfa-Ba
sic-Befehlen:
> kürzerer Code
> volle Kontrolle
> es sind keine Grenzen gesetzt, die die maximale Anzahl von
Screens und Windows einschränkt
> es lassen sich, wenn gewünscht, auch direkt Gadgets und der
Systemfont eintragen ( das gab bei mir auch den Ausschlag, eine
eigene Screen-Routine zu schreiben )
Die Übergabeparameter sind in den entsprechenden Routinen erklärt. Um
diese Routinen nutzen zu können, muß man vorher zwei Arrays ( für
Screens und Windows ) definieren:
DIM scr%(anzahl_screens&), win%(anzahl_windows&)
Diese Variablen halten dann immer die Basisadressen der Screens und Win
dows. Wird ein Screen/Window geschlossen, dann wird die Variable automa
tisch gelöscht ( siehe Prozeduren ).
Die Prozeduren sind übrigens Public Domain im eigentlichen Sinne, d.h.,
Du darfst sie ohne Bedenken für Deine eigene Programme benutzen, Du
darfst sie verkaufen (:^) und Du darfst sie unter Deinem eigenen Namen
veröffentlichen ( das dürfte allerdings dank dem Bekanntheitsgrad von
Forum Amiga auffallen :-)
PROCEDURE oscreen(nr&,xpos&,ypos&,width&,height&,planes&,mode%,typ&)
'
' Benötigt: Array "scr%(anzahl_screens&)"
'
' Parameter: nr& = Screennummer für Array
' width& = Screenbreite
' height& = Screenhöhe
' planes& = Anzahl Bitplanes
' mode% = 0:LowRes, $8000:MedRes, +4: Interlace
' typ& = 1: WorkbenchScreen, 15: CustomScreen
'
LOCAL nscr%
nscr%=AllocMem(32,&H1+&H10000)
IF nscr%
DPOKE nscr%+0,xpos&
DPOKE nscr%+2,ypos&
DPOKE nscr%+4,width&
DPOKE nscr%+6,height&
DPOKE nscr%+8,planes&
POKE nscr%+10,2
POKE nscr%+11,1
DPOKE nscr%+12,mode%
DPOKE nscr%+14,typ&
REM LPOKE nscr%+16,V:textattr$ ! Erklärung siehe unten
scr%(nr&)=OpenScreen(nscr%)
~FreeMem(nscr%,32)
ENDIF
RETURN
PROCEDURE owindow(nr&,xpos&,ypos&,width&,height&,idcmp%,flags%,scrnr&)
'
' Benötigt Array "win%(anzahl_windows&)"
'
' nr& = Array-Nummer
' xpos&,ypos&,width&,height& = Window-Maße
' idcmp% = IDCMP-Flags ( siehe GFA-Interpreter-Handbuch )
' flags% = Window-Flags (siehe GFA-Interpreter-Handbuch )
' scrnr& = Arraynummer des Screens oder "-1" für aktuellen Screen
'
LOCAL nwin%
nwin%=AllocMem(48,&H1+&H10000)
IF nwin%
DPOKE nwin%+0,xpos&
DPOKE nwin%+2,ypos&
DPOKE nwin%+4,width&
DPOKE nwin%+6,height&
POKE nwin%+8,2
POKE nwin%+9,1
LPOKE nwin%+10,idcmp%
LPOKE nwin%+14,flags%
IF scrnr&=-1
LPOKE nwin%+30,0
DPOKE nwin%+46,1
ELSE
LPOKE nwin%+30,scr%(scrnr&)
DPOKE nwin%+46,15
ENDIF
win%(nr&)=OpenWindow(nwin%)
~FreeMem(nwin%,48)
ENDIF
RETURN
PROCEDURE cscreen(nr&)
'
' schließt einen Screen ( nr& = Arraynummer )
'
IF scr%(nr&)
~CloseScreen(scr%(nr&))
scr%(nr&)=0
ENDIF
RETURN
PROCEDURE cwindow(nr&)
'
' schließt ein Window ( nr& = Arraynummer )
'
IF win%(nr&)
~CloseWindow(win%(nr&))
win%(nr&)=0
ENDIF
RETURN
Um den Rastport des Windows zu bekommen, schreibt man:
rp%=LONG{win%(nr&)+50}
Um den Viewport des Screens zu bekommen, schreibt man:
vp%=scr%(1)+44
Diese beiden Zeiger benötigt man nur für Grafikoperationen mit den
Systemroutinen. Bitte beachte, daß die Gfa-Basic-Befehle natürlich nicht
auf diese Screens und Windows ansprechen, ein entsprechender "PRINT"-
Befehl öffnet ein eigenes Window!
Außerdem ist zu beachten, daß die Windows und Screens auch geschlossen
werden am Programmende, denn das übernimmt Gfa-Basic nun nicht mehr
( volle Kontrolle heißt auch mehr Arbeit ;-). Ein ordnungsmäßiges
Schließen sieht so aus:
@cwindow(arraynummer&)
@screen(arraynummer&)
Ob die Screens/Windows auch tatsächlich existieren, prüfen diese Routi-
nen automatisch nach. Um den Systemzeichensatz für eigene Screens und
Windows zu benutzen, sollte man unmittelbar nach der o.a. "DIM"-Anwei
sung folgende Zeichen in ein Programm einführen:
font$="topaz.font"+CHR$(0)
textattr$=MKL$(V:font$)+MKI$(8)+MKI$(0)
font%=OpenFont(V:textattr$)
Wenn diese Zeilen eingefügt werden, dann sollte auch der "REM"-Befehl
in der "oscreen"-Prozedur gelöscht werden. Um den Font in einem Window
zu benutzen, muß folgendermaßen vorgegangen werden:
@owindow(1,0,0,640,256,0,4096+65536,1)
rp1%=LONG{win%(1)+50}
~SetFont(rp1%,font%)
Natürlich sollte nicht vergessen werden, daß der Font am Programmende
auch geschlossen werden muß, und zwar NACHDEM alle Windows und Screens
geschlossen werden:
IF font%
~CloseFont(font%)
ENDIF
Fragen bitte über das Forum an mich, denn alle Leser sollen von mögli
chen Fragen profitieren... und nun viel Spaß!